home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / 001-010 / amok07 / queue / queue.mod < prev    next >
Encoding:
Modula Implementation  |  1993-11-04  |  2.8 KB  |  93 lines

  1. (*********************************************************************
  2.  *                                                                   *
  3.  *  :Program.    Queue.mod                                           *
  4.  *  :Author.     Michael Frieß                                       *
  5.  *  :Address.    Kernerstr. 22a                                      *
  6.  *  :shortcut.   [MiF]                                               *
  7.  *  :Version.    1.0                                                 *
  8.  *  :Date.       14.09.88                                            *
  9.  *  :Copyright.  PD                                                  *
  10.  *  :Language.   Modula-II                                           *
  11.  *  :Translator. M2Amiga                                             *
  12.  *  :Imports.    MemSystem (at least V1.0 --> Amok#5)                *
  13.  *  :Contents.   Generic data type: Queue                            *
  14.  *                                                                   *
  15.  *********************************************************************)
  16.  
  17. IMPLEMENTATION MODULE Queue;
  18. (* MODULE Queue: (C) Copyright 1988 by Michael Frieß *)
  19.  
  20. FROM SYSTEM    IMPORT BYTE, ADR, ADDRESS;
  21. FROM MemSystem IMPORT Allocate, Deallocate;
  22. FROM Exec      IMPORT CopyMem;
  23.  
  24. CONST copyright = "MODULE Queue: (C) Copyright 1988 by Michael Frieß";
  25.  
  26. TYPE queue      = POINTER TO queuebody;
  27.      elementptr = POINTER TO element;
  28.      element    = RECORD
  29.                    Data : ADDRESS;
  30.                    Next : elementptr;
  31.                   END;
  32.       queuebody = RECORD
  33.                    Top, Bottom : elementptr;
  34.                   END;
  35.  
  36. PROCEDURE Init (VAR q:queue);
  37.  BEGIN
  38.   Allocate (q, SIZE(queuebody));
  39.   IF q = NIL THEN HALT END;
  40.   q^.Top := NIL;
  41.   q^.Bottom := NIL;
  42.  END Init;
  43.  
  44. PROCEDURE Write  (q:queue; Data : ARRAY OF BYTE);
  45.  BEGIN
  46.   IF q^.Bottom = NIL THEN
  47.     Allocate (q^.Bottom, SIZE(element));
  48.     IF q^.Bottom = NIL THEN HALT END;
  49.     q^.Bottom^.Next := NIL;
  50.     q^.Top :=  q^.Bottom
  51.   ELSE
  52.     Allocate (q^.Bottom^.Next, SIZE(element));
  53.     IF q^.Bottom^.Next = NIL THEN HALT END;
  54.     q^.Bottom := q^.Bottom^.Next
  55.   END;
  56.   Allocate (q^.Bottom^.Data, HIGH(Data)+1);
  57.   IF q^.Bottom^.Data = NIL THEN HALT END;
  58.   CopyMem (ADR(Data), q^.Bottom^.Data, HIGH(Data)+1);
  59.  END Write;
  60.  
  61. PROCEDURE Read (q:queue; VAR Data : ARRAY OF BYTE);
  62.  VAR p : elementptr;
  63.  BEGIN
  64.   IF q^.Top # NIL THEN
  65.    CopyMem (q^.Top^.Data, ADR(Data), HIGH(Data)+1);
  66.    IF q^.Top = q^.Bottom THEN
  67.     q^.Bottom := NIL;
  68.    END;
  69.    p := q^.Top^.Next;
  70.    Deallocate (q^.Top^.Data);
  71.    Deallocate (q^.Top);
  72.    q^.Top := p
  73.   END
  74.  END Read;
  75.  
  76. PROCEDURE Empty (q:queue) : BOOLEAN;
  77.  BEGIN
  78.   RETURN q^.Top = NIL
  79.  END Empty;
  80.  
  81. PROCEDURE Discard (VAR q:queue);
  82.  BEGIN
  83.   WHILE q^.Top # NIL DO
  84.    q^.Bottom := q^.Top^.Next;
  85.    Deallocate (q^.Top^.Data);
  86.    Deallocate (q^.Top);
  87.    q^.Top := q^.Bottom
  88.   END;
  89.   Deallocate (q);
  90.  END Discard;
  91.  
  92. END Queue.
  93.